package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;


import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;

import com.divemotor.ventarepuestosinternet.dao.GenericoDAO;

import com.divemotor.ventarepuestosinternet.util.Constantes;

@SuppressWarnings("unchecked")
public class GenericoDAOImpl<E, ID extends Serializable> implements GenericoDAO<E, ID>, Serializable {

	
	private static final long serialVersionUID = -6509750574693234543L;
	private Class<E> clase;

	protected void setClase(final Class<E> clase) {
		this.clase = clase;
	}

	@Autowired
	protected SessionFactory sessionFactory;

	@Override
	public E insertar(E entidad) {
		sessionFactory.getCurrentSession().persist(entidad);
		return entidad;
	}

	@Override
	public void eliminar(E entidad) {
		sessionFactory.getCurrentSession().delete(entidad);
	}

	@Override
	public void actualizar(E entidad) {
      sessionFactory.getCurrentSession().merge(entidad);

	}

	@Override
	public E obtenerPorId(ID id) {
		return (E) sessionFactory.getCurrentSession().get(clase, id);
	}

	@Override
	public List<E> listarTodos() {
		return sessionFactory.getCurrentSession().createCriteria(clase)
												 .add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)))
												 .list();
	}
	
	@Override
	public List<E> listarActivos() {
		return sessionFactory.getCurrentSession().createCriteria(clase)
												 .add(Restrictions.eq("estado", Constantes.ESTADO_ACTIVO))
												 .list();
	}

	@Override
	public List<E> listarPorPropiedad(String propiedad, Object value) {
		return sessionFactory
				.getCurrentSession()
				.createCriteria(clase)
				.add(Restrictions.not(Restrictions.eq("estado",
						Constantes.ESTADO_ELIMINADO)))
				.add(Restrictions.eq(propiedad, value).ignoreCase()).list();
	}
}
